home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 February
/
EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso
/
earcd
/
comm2
/
termsorc.lha
/
Extras
/
Source
/
term-source.lha
/
termRemember.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-09-26
|
9KB
|
473 lines
/*
** termRemember.c
**
** Login learn routines
**
** Copyright © 1990-1995 by Olaf `Olsen' Barthel
** All Rights Reserved
*/
/* How many characters to remember. */
#define REMEMBER_OUT 40
#define REMEMBER_IN 256
/* Yet another node variant. */
struct RecordNode
{
struct Node Node;
struct timeval Time;
};
/* What type of text was recorded. */
enum { RECORD_OUTPUT,RECORD_INPUT };
/* The last ten bytes received. */
STATIC UBYTE RememberOutputData[2 * REMEMBER_OUT + 10];
STATIC WORD RememberOutputSize;
/* The last 256 bytes sent. */
STATIC UBYTE RememberInputData[2 * REMEMBER_IN + 10];
STATIC WORD RememberInputSize;
/* The name of the BBS we are currently recording for. */
STATIC UBYTE RecordName[50];
/* Recorded lines. */
STATIC struct List *RecordList;
STATIC LONG RecordCount;
/* Auxilary data. */
STATIC STRPTR RecordAuxBuffer;
/* Start of recording. */
STATIC struct timeval RecordTime;
/* FinishRecord():
*
* Finish the recording process, store the
* recorded data in a file.
*/
VOID
FinishRecord()
{
if(RecordCount)
{
UBYTE DummyBuffer[MAX_FILENAME_LENGTH];
struct FileRequester *FileRequest;
BlockWindows();
Recording = RecordingLine = FALSE;
Status = STATUS_READY;
if(RecordName[0])
strcpy(DummyBuffer,RecordName);
else
{
strcpy(DummyBuffer,LocaleString(MSG_SCREENPANEL_UNKNOWN_TXT));
strcpy(RecordName,DummyBuffer);
}
FixName(DummyBuffer);
DummyBuffer[27] = 0;
strcat(DummyBuffer,".term");
if(FileRequest = GetFile(Window,LocaleString(MSG_SAVE_RECORDED_FILE_TXT),"",DummyBuffer,DummyBuffer,"#?.(term|rexx)",TRUE,FALSE,FALSE,LocaleString(MSG_GLOBAL_SAVE_GAD),TRUE))
{
BPTR FileHandle;
LONG Error = 0;
struct timeval Delta = { 0,0 };
if(FileHandle = Open(DummyBuffer,MODE_NEWFILE))
{
SetIoErr(0);
if(FPrintf(FileHandle,LocaleString(MSG_RECORDFILE_HEADER_TXT),RecordName) < 1)
Error = IoErr();
if(!Error)
{
struct RecordNode *Node = (struct RecordNode *)RecordList -> lh_Head;
while(Node -> Node . ln_Succ && !Error)
{
if(Delta . tv_secs != Node -> Time . tv_secs)
{
LONG Secs;
Secs = (3 * Node -> Time . tv_secs) / 2 + (3 * Node -> Time . tv_micro) / 2000000;
SetIoErr(0);
if(FPrintf(FileHandle,"TIMEOUT %ld\n",Secs) < 1)
{
Error = IoErr();
break;
}
else
Delta = Node -> Time;
}
SetIoErr(0);
if(Node -> Node . ln_Type == RECORD_OUTPUT)
{
if(FPrintf(FileHandle,"WAIT TEXT \"%s\"\n",Node -> Node . ln_Name) < 1)
Error = IoErr();
}
else
{
if(FPrintf(FileHandle,"SEND TEXT \"%s\"\n\n",Node -> Node . ln_Name) < 1)
Error = IoErr();
}
Node = (struct RecordNode *)Node -> Node. ln_Succ;
}
}
Close(FileHandle);
ObtainSemaphore(&PatternSemaphore);
if(ChosenEntry)
{
if(MyEasyRequest(Window,LocaleString(MSG_USE_AS_LOGIN_SCRIPT_TXT),LocaleString(MSG_GLOBAL_YES_NO_TXT),ChosenEntry -> Header -> Name))
{
if(!ChosenEntry -> Config -> CommandConfig)
{
if(!CreateConfigEntry(ChosenEntry -> Config,PREF_COMMAND))
ShowError(Window,ERR_NO_MEM,NULL,NULL);
}
if(ChosenEntry -> Config -> CommandConfig)
{
PhonebookChanged = TRUE;
SPrintf(ChosenEntry -> Config -> CommandConfig -> LoginMacro,"\\a %s",DummyBuffer);
}
}
}
ReleaseSemaphore(&PatternSemaphore);
}
else
Error = IoErr();
if(!Error && Config -> MiscConfig -> CreateIcons && IconBase)
{
struct DiskObject *Icon;
if(!(Icon = GetDiskObject("ENV:def_term")))
{
if(!(Icon = GetDiskObject("ENV:def_rexx")))
{
if(Icon = GetDefDiskObject(WBPROJECT))
Icon -> do_DefaultTool = "RX";
}
}
if(Icon)
{
Icon -> do_CurrentX = Icon -> do_CurrentY = NO_ICON_POSITION;
PutDiskObject(DummyBuffer,Icon);
FreeDiskObject(Icon);
}
}
if(Error)
ShowError(Window,ERR_SAVE_ERROR,Error,DummyBuffer);
FreeAslRequest(FileRequest);
}
DeleteRecord();
ReleaseWindows();
}
}
/* CreateRecord(STRPTR BBSName):
*
* Start recording incoming and outgoing text.
*/
BOOLEAN __regargs
CreateRecord(STRPTR BBSName)
{
DeleteRecord();
if(RecordList = (struct List *)AllocVecPooled(sizeof(struct List),MEMF_ANY))
{
if(RecordAuxBuffer = (STRPTR)AllocVecPooled(1024,MEMF_ANY))
{
strcpy(RecordName,BBSName);
NewList(RecordList);
TimeRequest -> tr_node . io_Command = TR_GETSYSTIME;
DoIO(TimeRequest);
RecordTime = TimeRequest -> tr_time;
return(TRUE);
}
FreeVecPooled(RecordList);
RecordList = NULL;
}
return(FALSE);
}
/* DeleteRecord():
*
* Stop recording, free auxilary buffers.
*/
VOID
DeleteRecord()
{
if(RecordAuxBuffer)
{
FreeVecPooled(RecordAuxBuffer);
RecordAuxBuffer = NULL;
}
if(RecordList)
{
DeleteList(RecordList);
RecordList = NULL;
}
RecordCount = 0;
}
/* RememberResetOutput():
*
* Reset output monitoring.
*/
VOID
RememberResetOutput()
{
RememberOutputSize = 0;
}
/* RememberOutputText(register STRPTR String,register LONG Size):
*
* Remember the last ten characters received.
*/
VOID __regargs
RememberOutputText(register STRPTR String,register LONG Size)
{
if(Size >= REMEMBER_OUT)
{
CopyMem(String + Size - REMEMBER_OUT,RememberOutputData,REMEMBER_OUT);
RememberOutputSize = REMEMBER_OUT;
}
else
{
if(RememberOutputSize + Size > REMEMBER_OUT)
{
LONG Delta = RememberOutputSize + Size - REMEMBER_OUT,i;
for(i = 0 ; i < RememberOutputSize - Delta ; i++)
RememberOutputData[i] = RememberOutputData[Delta + i];
while(i < REMEMBER_OUT)
RememberOutputData[i++] = *String++;
RememberOutputSize = REMEMBER_OUT;
}
else
{
CopyMem(String,&RememberOutputData[RememberOutputSize],Size);
RememberOutputSize += Size;
}
}
}
/* RememberResetInput():
*
* Reset input monitoring.
*/
VOID
RememberResetInput()
{
RememberInputSize = 0;
}
/* RememberInputText(register STRPTR String,register LONG Size):
*
* Remember the last 256 characters sent.
*/
VOID __regargs
RememberInputText(register STRPTR String,register LONG Size)
{
if(Size >= REMEMBER_IN)
{
CopyMem(String + Size - REMEMBER_IN,RememberInputData,REMEMBER_IN);
RememberInputSize = REMEMBER_IN;
}
else
{
if(RememberInputSize + Size > REMEMBER_IN)
{
LONG Delta = RememberInputSize + Size - REMEMBER_IN,i;
for(i = 0 ; i < RememberInputSize - Delta ; i++)
RememberInputData[i] = RememberInputData[Delta + i];
while(i < REMEMBER_IN)
RememberInputData[i++] = *String++;
RememberInputSize = REMEMBER_IN;
}
else
{
CopyMem(String,&RememberInputData[RememberInputSize],Size);
RememberInputSize += Size;
}
}
}
/* DoubleQuotes(STRPTR Source,LONG Len):
*
* Double all double-quotes in the input string
* in order to avoid trouble with the ARexx
* parser.
*/
STATIC VOID __regargs
DoubleQuotes(STRPTR Source,LONG Len)
{
STRPTR Dest = RecordAuxBuffer;
LONG i,Count = 0;
for(i = 0 ; i < Len ; i++)
{
if(Source[i] == '\"')
{
*Dest++ = '\"';
Count++;
}
*Dest++ = Source[i];
}
if(Count)
{
*Dest = 0;
strcpy(Source,RecordAuxBuffer);
}
}
/* RememberSpill():
*
* `Spill' the collected text, put it into the list.
*/
VOID
RememberSpill()
{
if(RecordList)
{
struct RecordNode *Node;
struct timeval Delta;
/* Calculate the difference in time
* between the last line stored and this
* line getting stored.
*/
TimeRequest -> tr_node . io_Command = TR_GETSYSTIME;
DoIO(TimeRequest);
Delta = TimeRequest -> tr_time;
SubTime(&Delta,&RecordTime);
RecordTime = TimeRequest -> tr_time;
if(!Delta . tv_secs)
Delta . tv_secs = 1;
Delta . tv_micro = 0;
if(RememberOutputSize)
{
DoubleQuotes(RememberOutputData,RememberOutputSize);
TranslateBack(RememberOutputData,RememberOutputSize,RecordAuxBuffer);
if(Node = (struct RecordNode *)AllocVecPooled(sizeof(struct RecordNode) + strlen(RecordAuxBuffer) + 1,MEMF_ANY))
{
Node -> Node . ln_Name = (STRPTR)(Node + 1);
Node -> Node . ln_Type = RECORD_OUTPUT;
strcpy(Node -> Node . ln_Name,RecordAuxBuffer);
Node -> Time = Delta;
AddTail(RecordList,(struct Node *)Node);
RecordCount++;
}
}
if(RememberInputSize)
{
DoubleQuotes(RememberInputData,RememberInputSize);
TranslateBack(RememberInputData,RememberInputSize,RecordAuxBuffer);
if(Node = (struct RecordNode *)AllocVecPooled(sizeof(struct RecordNode) + strlen(RecordAuxBuffer) + 1,MEMF_ANY))
{
Node -> Node . ln_Name = (STRPTR)(Node + 1);
Node -> Node . ln_Type = RECORD_INPUT;
strcpy(Node -> Node . ln_Name,RecordAuxBuffer);
Node -> Time = Delta;
AddTail(RecordList,(struct Node *)Node);
RecordCount++;
}
}
}
RememberOutputSize = RememberInputSize = 0;
}